#include<iostream>
#include<string>
#include<cstdio>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int func()
{
    std::cout<<"hello world"<<std::endl;
   _exit(23);
    //return 100;
    //exit(100);
}

int main()
{  
    pid_t id = fork();
    if(id<0)
    {
        printf("errno:%d,errstring:%s\n",errno,strerror(errno));
    }else if(id == 0)
    {
        int cnt = 5;
        while(true)
        {            
          printf("子进程运行中，pid:%d\n",getpid());
          cnt--;
          sleep(1);
        }
        //可不可以使用全局变量，获取子进程的退出码？
        exit(1);
    }else
    {
       // pid_t rid = wait(nullptr);
        int status = 0;
        //为什么我们只能通过系统调用获取子进程的退出信息？
        pid_t rid = waitpid(id,&status,0);//专门去等待某一个子进程 这里是等待父进程创建的子进程 
        if( rid > 0)
        {
            if(WIFEXITED(status))//W位wait IF为if EXITED是否为正常退出
            {
              printf("wait sub process success,rid:%d,status code:%d\n",rid,WEXITSTATUS(status));//根据status直接识取到子进程退出时的退出码 
            }else//走到这说明当前进程是异常退出的
            {
              printf("child process quit error!\n");
            }
        }else
        {
            perror("waitpid");
        }
        while(true)
        {
            printf("我是父进程：pid:%d\n",getpid());
            sleep(1);
        }
    }

   // char * p =nullptr;

   // *p = 'a';





    //printf("进程运行结束!\n");
    //sleep(2);
    //_exit(5);

    //sleep(2);

//     for(int i = 0; i < 200; i++)
//     {
//         std::cout << "code :" << i <<", errstring: " <<strerror(i) << std::endl;
//     }

    //printf("before: errno : %d, errstring: %s\n",errno,strerror(errno));  
    //FILE *fp = fopen("./log.txt", "r");
    //if(fp == nullptr)
    //{
    //    printf("after: errno : %d, errstring: %s\n", errno, strerror(errno));
    //    return errno;
    //}

    return 0;
}
